home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_nn-tk.idb / usr / freeware / lib / nn / tcl / killsel.tcl.z / killsel.tcl
Encoding:
Text File  |  1999-04-16  |  18.4 KB  |  709 lines

  1. ##################################################################
  2. #
  3. # GUI interface to kill/select
  4. #  rewrites the kill file
  5. #
  6. ##################################################################
  7.  
  8. proc killsel_setup {{item ""}} {
  9.     global ksel
  10.  
  11.     article_info
  12.     global ksel_group ksel_subj ksel_send ksel_from ksel_msgid nn_directory
  13.  
  14.     killsel_Make
  15.     update
  16.  
  17.     if {[file readable "$nn_directory/kill"]} {
  18.     set f [open "$nn_directory/kill" r]
  19.     while {[gets $f l] > 0} {
  20.         .killsel.lb.l insert end $l
  21.     }
  22.     close $f
  23.     }
  24.     
  25.     if {$item != ""} {
  26.     killsel_list_add
  27.  
  28.     ksel_parse_item $item
  29.  
  30.     set ksel(group) $ksel_group
  31.     
  32.     switch $ksel(type,0) {
  33.         "n"
  34.           {set ksel(strings,0) $ksel_send}
  35.         "s"
  36.           {set ksel(strings,0) $ksel_subj}
  37.         "f"
  38.           {set ksel(strings,0) $ksel_from}
  39.         "m"
  40.           {set ksel(strings,0) $ksel_msgid}
  41.     }
  42.     }
  43. }
  44.  
  45. proc killsel_exit {save} {
  46.     global token  
  47.  
  48.     if {$save == 1} {
  49.     killsel_writefile
  50.     recompile_kill
  51.     put_funct $token(K_KILLSEL) "b"
  52.     }
  53.     ksel_window destroy .killsel
  54.     ksel_window destroy .ksel
  55. }
  56.  
  57. proc killsel_writefile {} {
  58.     global ksel nn_directory
  59.  
  60.     if {$ksel(listbox) >= 0} {
  61.     ksel_out_item $ksel(listbox)
  62.     }
  63.  
  64.     set f [open "$nn_directory/kill" w]
  65.  
  66.     set size [.killsel.lb.l size]
  67.     for {set i 0} {$i < $size} {incr i} {
  68.     puts $f [.killsel.lb.l get $i]
  69.     }
  70.     close $f
  71. }
  72.  
  73. proc killsel_Make {} {
  74.     global ksel Config
  75.  
  76.     set ksel(listbox) -1
  77.  
  78.     set base .killsel
  79.     if {[winfo exists .killsel]} {
  80.         wm deiconify .killsel; return
  81.     }
  82.  
  83.     toplevel .killsel -class Toplevel 
  84.  
  85.     wm deiconify .killsel
  86.     wm title .killsel "killsel"
  87.     label .killsel.l \
  88.         -relief raised -text "Kill or Select"
  89.  
  90.     frame .killsel.buttons \
  91.          -borderwidth 1 -height 30 -relief sunken -width 30 
  92.     button .killsel.buttons.add \
  93.         -padx 0 -pady 0 -text Add -width 6 \
  94.     -command {killsel_list_add}
  95.  
  96.     button .killsel.buttons.del \
  97.         -padx 0 -pady 0 -text Delete -width 6 \
  98.     -command {killsel_list_delete}
  99.  
  100.     button .killsel.buttons.help \
  101.         -padx 0 -pady 0 -text Help -width 6 \
  102.     -command "put_extended {help nn-tk-kill}"
  103.     button .killsel.buttons.cancel \
  104.         -padx 0 -pady 0 -text Cancel -width 6 \
  105.     -command {killsel_exit 0}
  106.     button .killsel.buttons.save \
  107.         -padx 0 -pady 0 -text Save -width 6 \
  108.     -command {killsel_exit 1}
  109.     frame .killsel.buttons.dummy \
  110.     -width 16
  111.     frame .killsel.lb \
  112.          -borderwidth 1 -height 30 -relief raised -width 30 
  113.     listbox .killsel.lb.l \
  114.         -xscrollcommand {.killsel.lb.02 set} \
  115.         -yscrollcommand {.killsel.lb.03 set} 
  116.  
  117.     scrollbar .killsel.lb.02 \
  118.         -borderwidth 1 -command {.killsel.lb.l xview} \
  119.         -orient horiz -width 10 
  120.     scrollbar .killsel.lb.03 \
  121.         -borderwidth 1 -command {.killsel.lb.l yview} \
  122.         -orient vert -width 10 
  123.     ###################
  124.     # SETTING GEOMETRY
  125.     ###################
  126.     pack .killsel.l \
  127.         -anchor center -expand 0 -fill x -side top 
  128.     pack .killsel.buttons \
  129.         -anchor center -expand 0 -fill x -side top 
  130.     pack .killsel.buttons.add \
  131.         -anchor nw -expand 0 -fill none -side left 
  132.     pack .killsel.buttons.del \
  133.         -anchor nw -expand 0 -fill none -side left 
  134.     pack .killsel.buttons.cancel \
  135.         -anchor nw -expand 0 -fill none -side right
  136.     pack .killsel.buttons.save \
  137.         -anchor nw -expand 0 -fill none -side right
  138.     pack .killsel.buttons.help \
  139.         -anchor w -expand 0 -fill none -side right
  140.     pack .killsel.buttons.dummy \
  141.         -anchor w -expand 0 -fill none -side right
  142.     
  143.     pack .killsel.lb \
  144.         -anchor center -expand 1 -fill both -side top 
  145.     grid columnconf .killsel.lb 0 -weight 1
  146.     grid rowconf .killsel.lb 0 -weight 1
  147.     grid .killsel.lb.l \
  148.         -column 0 -row 0 -columnspan 1 -rowspan 1 -sticky nesw 
  149.     grid .killsel.lb.02 \
  150.         -column 0 -row 1 -columnspan 1 -rowspan 1 -sticky ew 
  151.     grid .killsel.lb.03 \
  152.         -column 1 -row 0 -columnspan 1 -rowspan 1 -sticky ns 
  153.  
  154.     bind .killsel.lb.l  <ButtonRelease-1> {ksel_press %y }
  155.     
  156.     balloonHelp_traverse  .killsel
  157.  
  158.     if {[info exists Config(.killsel)]} {
  159.     wm geometry  .killsel $Config(.killsel)
  160.     }
  161.  
  162. }
  163.  
  164. proc ksel_press {y} {
  165.     global ksel 
  166.  
  167.     set old $ksel(listbox)
  168.  
  169.     scan [.killsel.lb.l index @0,$y] %d n
  170.     set l [.killsel.lb.l get $n]
  171.     set ksel(listbox) $n
  172.  
  173.     if {$old >= 0} {
  174.     ksel_out_item $old
  175.     }
  176.  
  177.     ksel_parse_item $l
  178. }
  179.  
  180. proc killsel_list_delete {} {
  181.     global ksel
  182.  
  183.     if {$ksel(listbox) >= 0} {
  184.     .killsel.lb.l delete $ksel(listbox)
  185.     set ksel(listbox) -1
  186.     ksel_window hide .ksel
  187.     } elseif {$ksel(clistbox) >= 0} {
  188.     .killsel.lb.l delete $ksel(clistbox)
  189.     set ksel(clistbox) -1
  190.     ksel_window hide .ksel
  191.     }
  192. }
  193.     
  194. proc killsel_list_add {} {
  195.     global ksel
  196.  
  197.     if {$ksel(listbox) >= 0} {
  198.     ksel_out_item $ksel(listbox)
  199.     }
  200.  
  201.     if {$ksel(listbox) >= 0} {
  202.     .killsel.lb.l insert [expr $ksel(listbox)+1] ""
  203.     set ksel(listbox) [expr $ksel(listbox)+1]
  204.     } else {
  205.     .killsel.lb.l insert end ""
  206.     set ksel(listbox) [.killsel.lb.l size]
  207.     }
  208.     ksel_parse_item "::"
  209. }
  210.  
  211. proc ksel_setlabel {but lab {var ""} {chr ""}} {
  212.     global ksel
  213.  
  214.     $but configure -text $lab
  215.     if {$var != ""} {
  216.     set ksel($var) $chr
  217.     }
  218. }
  219.  
  220. proc ksel_item_subst {l} {
  221.     regsub -all {\\\\} $l "\01" t
  222.     regsub -all {\\:} $t "\02" t
  223.     return $t
  224. }
  225.  
  226. proc ksel_item_substs {l} {
  227.     regsub -all "\01" $l "\\" t
  228.     regsub -all "\02" $t ":" t
  229.     return $t
  230. }
  231.  
  232. proc ksel_item_substd {l} {
  233.     regsub -all {\\} $l {\\\\} t
  234.     regsub -all {:} $t {\\:} t
  235.     return $t
  236. }
  237.  
  238. proc ksel_parse_group {l} {
  239.     global ksel
  240.  
  241.     regexp {(/*)(.*)} $l d ksel(gregexp) ksel(group)
  242. }
  243.  
  244. proc ksel_parse_flags {l} {
  245.     global ksel
  246.  
  247.     set ksel(knotsel)  ""
  248.     if ([regexp {(.*)(\~)(.*)} $l d ls ksel(knotsel) lf]) {
  249.     set l "$ls$lf"
  250.     }
  251.  
  252.     set ksel(action) ""
  253.     if ([regexp {(.*)([\+\!])(.*)} $l d ls ksel(action) lf]) {
  254.     set l "$ls$lf"
  255.     }
  256.  
  257.     set ksel(followups) ""
  258.     if ([regexp {(.*)([\>\<])(.*)} $l d ls ksel(followups) lf]) {
  259.     set l "$ls$lf"
  260.     }
  261.  
  262.     set l "&$l"
  263.     set i 0
  264.     while {[regexp {^([\&\|])([^\&\|]*)(.*)} $l d joiner str rest] != 0}  {
  265.     ksel_parse_elem $i $joiner $str
  266.     set l $rest
  267.     incr i
  268.     }
  269. }
  270.     
  271. proc ksel_parse_elem {n joiner l} {
  272.     global ksel
  273.  
  274.     set ksel(type,$n) ""
  275.     if ([regexp {(.*)([nsfcClLam])(.*)} $l d ls ksel(type,$n) lf]) {
  276.     set l "$ls$lf"
  277.     }
  278.  
  279.     set ksel(regexp,$n) ""
  280.     if ([regexp {(.*)([/])(.*)} $l d ls ksel(regexp,$n) lf]) {
  281.     set l "$ls$lf"
  282.     }
  283.  
  284.     set ksel(case,$n) ""
  285.     if ([regexp {(.*)([=])(.*)} $l d ls ksel(case,$n) lf]) {
  286.     set l "$ls$lf"
  287.     }
  288.  
  289.     set ksel(join,$n) $joiner
  290.     
  291. }
  292.     
  293. proc ksel_parse_item {ent} {
  294.     global ksel
  295.  
  296.     if {[string index $ent 0] == "\#"} {
  297.     set ksel(clistbox) $ksel(listbox)
  298.     set ksel(listbox) -1
  299.     return
  300.     } else {
  301.     set ksel(clistbox) -1
  302.     if {![winfo exists .ksel]} {
  303.       ksel_Make
  304.     }
  305.     if {![winfo ismapped .ksel]} {
  306.       ksel_window unhide .ksel
  307.     }
  308.     set ent [ksel_item_subst $ent]
  309.     set lent [split $ent ":"]
  310.     set  ctime [lindex $lent 0]
  311.     set ksel(expire) ""
  312.     if {[regexp {^[0123456789]+$} $ctime d]} {
  313.         if {$ctime < 1000} {
  314.         set ksel(expire) $ctime
  315.         } else {
  316.         set ksel(expire) [expr (($ctime-[clock seconds])/86400)+1]
  317.         }
  318.         set lent [lrange $lent 1 end]
  319.     }
  320.     ksel_parse_group [lindex $lent 0]
  321.     ksel_parse_flags [lindex $lent 1]
  322.     set i 0
  323.     foreach s [lrange $lent 2 end] {
  324.         set ksel(strings,$i) $s
  325.         set ksel(count) $i
  326.         incr i
  327.     }
  328.     ksel_set_panel
  329.     }
  330. }
  331.  
  332. proc ksel_out_item {pos} {
  333.     global ksel
  334.  
  335.     if {$ksel(type,0) == ""} {
  336.      killsel_list_delete
  337.     return
  338.     }
  339.     
  340.     set etxt $ksel(expire)
  341.     if {$etxt != ""} {
  342.     set etxt [expr $etxt*86400+[clock seconds]]
  343.     set etxt "$etxt:"
  344.     }
  345.  
  346.     set group "$ksel(gregexp)$ksel(group):"
  347.  
  348.     set mflag "$ksel(knotsel)$ksel(action)$ksel(followups)"
  349.  
  350.     set flags ""
  351.     set strings ""
  352.     set slaves [pack slaves .ksel]
  353.     foreach w $slaves {
  354.     if {[regexp  {\.ksel\.m([0123456789]+)} $w d n]} {
  355.         if {$ksel(type,$n) != ""} {
  356.         if {$n != 0} {
  357.             set flags "$flags$ksel(join,$n)"
  358.         }
  359.         set flags "$flags$ksel(type,$n)$ksel(regexp,$n)$ksel(case,$n)"
  360.         set s [ksel_item_substd $ksel(strings,$n)]
  361.         set strings "$strings:$s"
  362.         }
  363.     }
  364.     }
  365.  
  366.     .killsel.lb.l delete $pos
  367.     .killsel.lb.l insert $pos "$etxt$group$mflag$flags$strings"
  368. }
  369.  
  370. proc ksel_set_panel {} {
  371.     global ksel
  372.     
  373.     switch $ksel(action) {
  374.     ""
  375.       {ksel_setlabel .ksel.fix.f.action NONE }
  376.     "+"
  377.       {ksel_setlabel .ksel.fix.f.action auto-select }
  378.     "!"
  379.       {ksel_setlabel .ksel.fix.f.action auto-kill }
  380.     }
  381.  
  382.     switch $ksel(followups) {
  383.     ""
  384.       {ksel_setlabel .ksel.fix.fr.f.follow "all" }
  385.     "+"
  386.       {ksel_setlabel .ksel.fix.fr.f.follow "only followups" }
  387.     "!"
  388.       {ksel_setlabel .ksel.fix.fr.f.follow "only base articles" }
  389.     }
  390.  
  391.     for {set i 0} {$i <= $ksel(count)} {incr i} {
  392.     if {![winfo exists .ksel.m$i]}  {
  393.         ksel_frame_elem $i [expr $i-1]
  394.     }
  395.     ksel_set_elem $i
  396.     }
  397.     for {set i [expr $ksel(count)+1]} {$i <= 25} {incr i} {
  398.     if {[winfo exists .ksel.m$i]}  {
  399.         ksel_destroy_elem .ksel.m$i $i
  400.     }
  401.     }
  402. }
  403.  
  404. proc ksel_destroy_elem {w n} {
  405.     global ksel
  406.  
  407.     destroy $w
  408.     set ksel(strings,$n) ""
  409.     set ksel(regexp,$n) ""
  410.     set ksel(case,$n) ""
  411. }
  412.  
  413. proc ksel_set_elem_type {n} {
  414.     global ksel
  415.  
  416.     switch $ksel(type,$n) {
  417.     ""
  418.     {ksel_setlabel .ksel.m$n.i.type TYPE }
  419.     "n"
  420.     {ksel_setlabel .ksel.m$n.i.type name }
  421.     "s"
  422.     {ksel_setlabel .ksel.m$n.i.type subject }
  423.     "f"
  424.     {ksel_setlabel .ksel.m$n.i.type from type }
  425.     "m"
  426.     {ksel_setlabel .ksel.m$n.i.type message-id }
  427.     "c"
  428.     {ksel_setlabel .ksel.m$n.i.type <crossposts }
  429.     "C"
  430.     {ksel_setlabel .ksel.m$n.i.type >crossposts }
  431.     "l"
  432.     {ksel_setlabel .ksel.m$n.i.type <lines type }
  433.     "L"
  434.     {ksel_setlabel .ksel.m$n.i.type >lines type }
  435.     "a"
  436.     {ksel_setlabel .ksel.m$n.i.type ignore type }
  437.     }
  438. }
  439.  
  440. proc ksel_set_elem {n} {
  441.     global ksel k_regexp k_case
  442.  
  443.     switch $ksel(join,$n) {
  444.     "|"
  445.       {ksel_setlabel .ksel.m$n.i.con OR }
  446.     "&"
  447.       {ksel_setlabel .ksel.m$n.i.con AND }
  448.     }
  449.  
  450.     set ksel(strings,$n) [ksel_item_substs $ksel(strings,$n)]
  451.  
  452.     ksel_set_elem_type 0
  453.  
  454.     if {$ksel(regexp,$n) != ""} {
  455.     set k_regexp($n) 1
  456.     } else {
  457.     set k_regexp($n) 0
  458.     }
  459.     if {$ksel(case,$n) != ""} {
  460.     set k_case($n) 1
  461.     } else {
  462.     set k_case($n) 0
  463.     }
  464. }
  465.  
  466. proc ksel_Make {args} {
  467.     global ksel
  468.  
  469.     set base .ksel
  470.     if {[winfo exists .ksel]} {
  471.         wm deiconify .ksel; return
  472.     }
  473.     ###################
  474.     # CREATING WIDGETS
  475.     ###################
  476.     toplevel .ksel -class Toplevel 
  477.     bind .ksel <Destroy> ksel_destroyed
  478.     wm deiconify .ksel
  479.     wm title .ksel "ksel"
  480.  
  481.     set rx [expr [winfo rootx .killsel]+[winfo width .killsel]+10]
  482.     set ry [winfo rooty .killsel]
  483.     wm geometry .ksel "+$rx+$ry"
  484.  
  485.     label .ksel.l \
  486.         -relief raised -text {Kill or Select Item} 
  487.     frame .ksel.fix \
  488.         -borderwidth 2 -height 30 -relief raised -width 30 
  489.     frame .ksel.fix.f \
  490.         -borderwidth 1 -height 30 -relief sunken -width 30 
  491.  
  492.     menubutton .ksel.fix.f.action \
  493.         -indicatoron 1 -menu .ksel.fix.f.action.m -padx 10 -pady 3 \
  494.         -relief raised 
  495.     menu .ksel.fix.f.action.m -tearoff 0
  496.     .ksel.fix.f.action.m add command -label NONE \
  497.     -command "ksel_setlabel .ksel.fix.f.action NONE action \"\""
  498.     .ksel.fix.f.action.m add command -label auto-select \
  499.     -command "ksel_setlabel .ksel.fix.f.action auto-select action +" 
  500.     .ksel.fix.f.action.m add command -label auto-kill \
  501.     -command "ksel_setlabel .ksel.fix.f.action auto-kill action !" 
  502.  
  503.     frame .ksel.fix.f.m \
  504.         -borderwidth 1 -height 30 -relief raised -width 30 
  505.     label .ksel.fix.f.m.l \
  506.         -anchor w -text Group 
  507.     entry .ksel.fix.f.m.group \
  508.         -textvariable ksel(group)
  509.  
  510.     checkbutton .ksel.fix.f.reg \
  511.         -relief raised -text {Regular Expression} -variable ksel(gregexp) \
  512.     -onvalue "/" -offvalue ""
  513.     frame .ksel.fix.fr \
  514.         -borderwidth 1 -height 30 -relief sunken -width 30
  515.  
  516.     frame .ksel.fix.fr.f \
  517.          -borderwidth 1 -height 30 -relief sunken -width 30 
  518.     menubutton .ksel.fix.fr.f.follow \
  519.         -indicatoron 1 -menu .ksel.fix.fr.f.follow.m \
  520.         -relief raised -width 24
  521.     menu .ksel.fix.fr.f.follow.m -tearoff 0
  522.     .ksel.fix.fr.f.follow.m add command -label all \
  523.     -command "ksel_setlabel .ksel.fix.fr.f.follow {all} followups \"\""
  524.     .ksel.fix.fr.f.follow.m add command -label {only followups} \
  525.     -command "ksel_setlabel .ksel.fix.fr.f.follow {only followup} followups >" 
  526.     .ksel.fix.fr.f.follow.m add command -label  {only base articles}\
  527.     -command "ksel_setlabel .ksel.fix.fr.f.follow {only base article} followups <" 
  528.     checkbutton .ksel.fix.fr.f.knotsel \
  529.         -anchor w \
  530.         -padx 4 -relief raised \
  531.         -text {Kill articles not selected} -variable ksel(notsel) \
  532.     -onvalue "-" -offvalue "" -width 28
  533.     frame .ksel.fix.fr.f.e
  534.     label .ksel.fix.fr.f.e.l  -text "expire(days)"
  535.     entry .ksel.fix.fr.f.e.ent -textvariable ksel(expire)
  536.     ###################
  537.     # SETTING GEOMETRY
  538.     ###################
  539.     pack .ksel.l \
  540.         -anchor center -expand 0 -fill x -side top 
  541.     pack .ksel.fix \
  542.         -anchor center -expand 0 -fill both -side top 
  543.     pack .ksel.fix.f \
  544.         -anchor center -expand 0 -fill both -side top 
  545.     pack .ksel.fix.f.action \
  546.         -anchor center -expand 0 -fill none -pady 4 -side top 
  547.     pack .ksel.fix.f.m \
  548.         -anchor center -expand 0 -fill x -side top 
  549.     pack .ksel.fix.f.m.l \
  550.         -anchor center -expand 0 -fill none -padx 2 -pady 2 -side left 
  551.     pack .ksel.fix.f.m.group \
  552.         -anchor center -expand 1 -fill x -padx 2 -pady 2 -side right 
  553.     pack .ksel.fix.f.reg \
  554.         -anchor w -expand 0 -fill none -side top 
  555.     pack .ksel.fix.fr \
  556.         -anchor center -expand 0 -fill both -side top 
  557.     pack .ksel.fix.fr.f \
  558.         -anchor center -expand 0 -fill none -side top 
  559.     pack .ksel.fix.fr.f.follow \
  560.         -anchor w -expand 0  -side top
  561.     pack .ksel.fix.fr.f.knotsel \
  562.         -anchor w -expand 0  -side top
  563.     pack .ksel.fix.fr.f.e \
  564.         -anchor w -expand 0  -side top
  565.     pack .ksel.fix.fr.f.e.l \
  566.     -anchor w -side left
  567.     pack .ksel.fix.fr.f.e.ent \
  568.     -anchor w -side right
  569. }
  570.  
  571. proc ksel_elem_empty {} {
  572.     for {set i 0} {$i <= 25} {incr i} {
  573.     if {![winfo exists .ksel.m$i]}  {
  574.         return $i
  575.     }
  576.     }
  577.     return $i
  578. }
  579.  
  580. proc ksel_elem_new {m l j} {
  581.     global ksel
  582.  
  583.     set n [ksel_elem_empty]
  584.     ksel_frame_elem  $n $m
  585.     set ksel(type,$n) ""
  586.     ksel_setlabel .ksel.m$n.i.con $l join,$n $j
  587. }
  588.  
  589. proc ksel_frame_elem {n m} {
  590.     global ksel
  591.  
  592.     frame .ksel.m$n \
  593.         -borderwidth 1 -height 184 -relief sunken \
  594.         -width 30 
  595.     frame .ksel.m$n.i \
  596.         -borderwidth 1 -height 30 -relief sunken -width 30 
  597.  
  598.     menubutton .ksel.m$n.i.con \
  599.         -indicatoron 1 -menu .ksel.m$n.i.con.m -padx 4 -pady 1 \
  600.     -relief raised -text conn 
  601.     menu .ksel.m$n.i.con.m  -tearoff 0
  602.      .ksel.m$n.i.con.m add command -label OR \
  603.     -command "ksel_setlabel .ksel.m$n.i.con OR join,$n |"
  604.     .ksel.m$n.i.con.m add command -label AND \
  605.     -command "ksel_setlabel .ksel.m$n.i.con AND join,$n &" 
  606.  
  607.     entry .ksel.m$n.i.str \
  608.         -textvariable ksel(strings,$n) -width 32
  609.     menubutton .ksel.m$n.i.type \
  610.         -indicatoron 1 -menu .ksel.m$n.i.type.m -padx 2 -pady 1 \
  611.         -relief raised -text TYPE
  612.     menu .ksel.m$n.i.type.m  -tearoff 0
  613.     .ksel.m$n.i.type.m add command -label name\
  614.     -command "ksel_setlabel .ksel.m$n.i.type name type,$n n"
  615.     .ksel.m$n.i.type.m add command -label subject\
  616.     -command "ksel_setlabel .ksel.m$n.i.type subject type,$n s"
  617.     .ksel.m$n.i.type.m add command -label from\
  618.     -command "ksel_setlabel .ksel.m$n.i.type from type,$n f"
  619.     .ksel.m$n.i.type.m add command -label message-id\
  620.     -command "ksel_setlabel .ksel.m$n.i.type msgid type,$n m"
  621.     .ksel.m$n.i.type.m add command -label <crossposts\
  622.     -command "ksel_setlabel .ksel.m$n.i.type <crossposts type,$n c"
  623.     .ksel.m$n.i.type.m add command -label >crossposts\
  624.     -command "ksel_setlabel .ksel.m$n.i.type >crossposts type,$n C"
  625.     .ksel.m$n.i.type.m add command -label <lines\
  626.     -command "ksel_setlabel .ksel.m$n.i.type <lines type,$n l"
  627.     .ksel.m$n.i.type.m add command -label >lines\
  628.     -command "ksel_setlabel .ksel.m$n.i.type >lines type,$n L"
  629.     .ksel.m$n.i.type.m add command -label ignore\
  630.     -command "ksel_setlabel .ksel.m$n.i.type ignore type,$n a"
  631.  
  632.     frame .ksel.m$n.chk \
  633.         -borderwidth 1 -height 30 -relief sunken -width 30 
  634.     checkbutton .ksel.m$n.chk.regexp \
  635.         -anchor w  \
  636.         -relief raised -text {Regular expression} \
  637.         -variable ksel(regexp,$n) -onvalue "/" -offvalue ""
  638.     checkbutton .ksel.m$n.chk.case \
  639.         -anchor w \
  640.         -relief raised -text {Exact match} \
  641.         -variable ksel(case,$n)  -onvalue "=" -offvalue ""
  642.     frame .ksel.m$n.more \
  643.         -borderwidth 1 -height 30 -relief sunken -width 30 
  644.     button .ksel.m$n.more.or \
  645.         -pady 0 -text or... -command "ksel_elem_new $n OR |"
  646.     button .ksel.m$n.more.and \
  647.         -pady 0 -text and...  -command "ksel_elem_new $n AND &"
  648.     button .ksel.m$n.more.del \
  649.         -padx 9 -pady 0 -text Delete \
  650.     -command "ksel_destroy_elem .ksel.m$n $n"
  651.  
  652.     if {$n == 0} {
  653.     pack .ksel.m$n \
  654.         -anchor center -expand 0 -fill x -side top
  655.     } else {
  656.     pack .ksel.m$n \
  657.         -anchor center -expand 0 -fill x -side top \
  658.         -after .ksel.m$m
  659.     }
  660.     pack .ksel.m$n.i \
  661.         -anchor center -expand 0 -fill x -side top 
  662.     if {$n != 0} {
  663.     pack .ksel.m$n.i.con \
  664.         -anchor w -expand 0 -fill none -padx 4 -side left
  665.     }
  666.     pack .ksel.m$n.i.str \
  667.         -anchor center -expand 1 -fill x -padx 3 -pady 3 -side left 
  668.     pack .ksel.m$n.i.type \
  669.         -anchor center -expand 0 -fill x -padx 4 -side left 
  670.     pack .ksel.m$n.chk \
  671.         -anchor center -expand 0 -fill x -side top 
  672.     pack .ksel.m$n.chk.regexp \
  673.         -anchor w -expand 0 -fill x -padx 5 -side left 
  674.     pack .ksel.m$n.chk.case \
  675.         -anchor e -expand 0 -fill x -padx 5 -side right 
  676.     pack .ksel.m$n.more \
  677.         -anchor center -expand 0 -fill x -padx 8 -side top 
  678.     pack .ksel.m$n.more.or \
  679.         -anchor w -expand 0 -fill none -side left 
  680.     pack .ksel.m$n.more.and \
  681.         -anchor w -expand 0 -fill none -side left 
  682.     if {$n != 0} {
  683.     pack .ksel.m$n.more.del \
  684.         -anchor e -expand 0 -fill none -side right
  685.     }
  686.     
  687.     balloonHelp_traverse .ksel
  688. }
  689.  
  690. proc ksel_window {args} {
  691. global vTcl
  692.     set cmd [lindex $args 0]
  693.     set name [lindex $args 1]
  694.     if {$name == "" || $cmd == ""} {return}
  695.     set exists [winfo exists $name]
  696.     switch $cmd {
  697.         hide    { if $exists {wm withdraw $name; return} }
  698.         unhide  { if $exists {wm deiconify $name; return} }
  699.         iconify { if $exists {wm iconify $name; return} }
  700.         destroy { if $exists {destroy $name; return} }
  701.     }
  702. }
  703.  
  704. proc ksel_destroyed {} {
  705.     global ksel
  706.  
  707.     set ksel(listbox) -1
  708. }
  709.